<?php

/**
 * nlPrimaryKeyHelper
 * @author NitraLabs
 * 
 */
class nlPrimaryKeyHelper {

    /**
     * Метод предназначен для изменения имени первичного ключа, если он типа string.
     * 
     * @param string $model_name
     * @param string $new_name
     * @param string $old_name
     */
    public static function renamePrimaryKey($model_name, $old_name, $new_name) {


        set_time_limit(0);
        if ($model_name && $new_name && $old_name) {
            // Проверка на существоваие такой записи, иначе - ошибка.
            $table = Doctrine::getTable($model_name);
            $old_record = $table->find($old_name);
            if ($old_record) {
                try {
                    $con = Doctrine_Manager::getInstance()->getCurrentConnection();
                    $con->beginTransaction();
                    $new_record = $table->getRecord();
                    foreach ($old_record->getData() as $key => $data) {
                        $new_record->{$key} = $data;
                    }
                    $new_record->{$table->getIdentifier()} = $new_name;
                    $new_record->save();

                    // Выборка всех связанных классов
                    $related_models = Doctrine::getLoadedModels();

                    foreach ($related_models as $model) {
                        $related_table = Doctrine::getTable($model);
                        if ($related_table->hasColumn($table->getIdentifier()) && $model != $model_name) {
                            $related_records = Doctrine_Query::create()
                                    ->update($model . ' alias')
                                    ->set('alias.' . $table->getIdentifier(), '?', $new_name)
                                    ->where('alias.' . $table->getIdentifier() . ' = ?', $old_name);
                            if ($related_table->hasColumn('deleted_at')) {
                                $related_records->orWhere("alias.deleted_at IS NOT NULL AND alias. {$table->getIdentifier()} = ?", $old_name);
                            }

                            $related_records->execute();
                        }
                    }
                    $old_record->delete();
                    $con->commit();
                } catch (Exception $e) {
                    $con->rollback();
                    sfContext::getInstance()->getUser()->setFlash('error', 'Ошибки в изменении названия. 
                                                         Если такое повторяется не раз обратитесь к администратору. 
                                                         Ошибка вызвана: nlPrimaryKeyHelper:renamePrimaryKey() в строке № 61; ' . $e->getMessage());
                }
            } else {
                throw new sfException('Попытка вызвать метод без параметров. Ошибка вызвана: nlPrimaryKeyHelper:renamePrimaryKey() в строке № 70; ');
            }
        } else {
            throw new sfException('Ошибка вызвана: nlPrimaryKeyHelper:renamePrimaryKey() в строке № 67; ');
        }
    }

}

?>